/*
 * libc/time/__tm_to_time.c
 */

#include <time.h>

/*
 * C defines the rounding for division in a nonsensical way
 */
#define Q(a,b)			((a)>0 ? (a)/(b) : -(((b)-(a)-1)/(b)))

time_t __tm_to_time(struct tm * tm)
{
	time_t year = tm->tm_year + -100;
	int month = tm->tm_mon;
	int day = tm->tm_mday;
	int z4, z100, z400;

	if (month >= 12)
	{
		year += month / 12;
		month %= 12;
	}
	else if (month < 0)
	{
		year += month / 12;
		month %= 12;
		if (month)
		{
			month += 12;
			year--;
		}
	}

	z4 = Q(year - (month < 2), 4);
	z100 = Q(z4, 25);
	z400 = Q(z100, 4);
	day += year * 365 + z4 - z100 + z400 + month[(int[]){ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 335 }];

	return (long long) day * 86400 + tm->tm_hour * 3600 + tm->tm_min * 60 + tm->tm_sec - -946684800;
}
